# -*- coding: utf-8 -*-
# Created by zhangyanqi on 2018/4/16

"""
判断一个 9x9 的数独是否有效。只需要根据以下规则，验证已经填入的数字是否有效即可。

数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
数独部分空格内已填入了数字，空白格用 '.' 表示。

说明:

一个有效的数独（部分已被填充）不一定是可解的。
只需要根据以上规则，验证已经填入的数字是否有效即可。
给定数独序列只包含数字 1-9 和字符 '.' 。
给定数独永远是 9x9 形式的。
"""


class Solution:
    def isValidSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: bool
        """
        # 判断每一行
        print("每一行")
        for i in board:
            temp = []
            for j in i:
                if j != ".":
                    temp.append(j)
            if len(set(temp)) != len(temp):
                return False

        # 判断每一列
        print("每一列")
        temp_ = []
        for i in range(0, 9):
            for j in board:
                item = j[i]
                if item != ".":
                    temp_.append(item)
            if len(set(temp_)) != len(temp_):
                return False
            temp_.clear()

        # 判断每个方块
        print("每一块")
        for area in range(0, 9):
            temp = []
            begin_line = int(area / 3) * 3
            begin_index = (area % 3) * 3
            for line in board[begin_line:begin_line + 3]:
                for i in line[begin_index:begin_index + 3]:
                    if i != ".":
                        temp.append(i)
            if len(set(temp)) != len(temp):
                return False
        return True


if __name__ == "__main__":
    s = Solution()
    # board = [
    #     ["6", "3", ".", ".", "7", ".", ".", ".", "."],
    #     ["6", ".", ".", "1", "9", "5", ".", ".", "."],
    #     [".", "9", "8", ".", ".", ".", ".", "6", "."],
    #     ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
    #     ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
    #     ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
    #     [".", "6", ".", ".", ".", ".", "2", "8", "."],
    #     [".", ".", ".", "4", "1", "9", ".", ".", "5"],
    #     [".", ".", ".", ".", "8", ".", ".", "7", "9"]
    # ]
    board = [["5", "3", ".", ".", "7", ".", ".", ".", "."],
             ["6", ".", ".", "1", "9", "5", ".", ".", "."],
             [".", "9", "8", ".", ".", ".", ".", "6", "."],
             ["8", ".", ".", ".", "6", ".", ".", ".", "3"],
             ["4", ".", ".", "8", ".", "3", ".", ".", "1"],
             ["7", ".", ".", ".", "2", ".", ".", ".", "6"],
             [".", "6", ".", ".", ".", ".", "2", "8", "."],
             [".", ".", ".", "4", "1", "9", ".", ".", "5"],
             [".", ".", ".", ".", "8", ".", ".", "7", "9"]]
    sudoku = s.isValidSudoku(board)
    print(sudoku)
